
import java.io.*;
import java.net.*;
import java.lang.reflect.*;

public class LinuxServer {
    public static void service() throws Exception {
        ServerSocket serverSocket = new ServerSocket(18080);
        System.out.println("服务器启动.");
        //无限循环 等待来自客服端的请求

        while (true) {
            Socket socket = serverSocket.accept();//来一个客户 创建对应一个 Socket对象

            InputStream in = socket.getInputStream();//接受来自Socket的信息
            byte[] bytes = new byte[6];//因为我知道Hailer 是6个字节（1个字母字符，一个字节就可以表示了），就创建了 6个大小的buyte数组
            in.read(bytes);//把客户发来的字节流 放入bytes数字
            //new String(bytes)作用是 把bytes的字节 转为字符串
            Class cls=Class.forName("Javafanse."+new String(bytes));//Class.forName方法是 获的一个类的名字是 该字符串 的  一个Class 实例


            Method method=cls.getMethod("say");//因为我知道方法名字是say
            // 不知道的时候需要通过反射 获取方法 是什么修饰的， 方法名是啥 ，因为麻烦，我就不写了

            //下面通过反射调用方法，在服务器的控制台 输出hello
            method.invoke(new Hailer());//因为我知道调用的方法是Hailer对象的，最简单就是new了，但是也可以通过反射获得
            //cls.getDeclaredConstructor().newInstance();  这个代码放在上面括号就是通过反射获取Hailer对象.
            socket.close();
        }
    }

    public static void main(String args[]) throws Exception {
        service();
    }
}

class Hailer{
    public String say(){
        System.out.println("客户通过网络发送了信息，服务器通过反射执行了方法，在服务器的控制台 输出:hello");
        return null;
    }
}